// 定义构造函数
// function Person() {
//   this.name = 'zhichao'
//   this.sex = 'nan'
// }
// Person.prototype.say = function (msg) {
//   console.log('说话：', msg)
// }
// let p1 = new Person()
// p1.say()
class PersonC2 {

  // 普通属性
  // name
  // sex
  static love = '打篮球'
  constructor(name, sex) {
    // 初始化已定义好类属性的值
    // 或者一次性初始化属性并且赋值,也可以完成复杂的属性赋值逻辑
    this.name = name
    this.sex = se
    console.log('构造函数被调用:');
  }
  static sayLove() {
    // 3.0 静态方法的this指向的事类 而不是类的实例对象  ：PersonC2
    // 3.1在静态方法中调用静态属性 OK
    console.log(`我的爱好是：${this.love}`);
    console.log(`我的爱好是：${PersonC2.love}`);
    // 3.2在静态方法里边 使用this 调用普通的属性：调用不到  undefined
    console.log(`3.2在静态方法里边调用普通的属性:${this.sex}`);
    // 3.3在静态方法里边 使用this 调用普通的方法：不是一个函数
    // console.log(`3.2在静态方法里边调用普通的属性:${this.say('我是静态方法中...')}`);
  }
  sayHaha() {
    // 4.0 普通方法中的this 指向的是调用它的对象
    // 4.1 在普通方法中 使用this  调用静态属性:undefined
    console.log('4.1 在普通方法中 使用this  调用静态属性:', this.love);
    // 4.2 在普通方法中 使用this  调用静态方法: is not function
    // this.sayLove()
    // 5.在普通方法中 使用类名 直接调用静态的属性和方法
    console.log('&&&&&&&&&');
    console.log('5.在普通方法中调用静态的属性', PersonC2.love);
    PersonC2.sayLove()
    console.log('&&&&&&&&&');
  }
  // 普通方法
  say(msg) {
    console.log(`姓名：${this.name},性别：${this.sex} ,说：${msg}`);
  }
}
// 1.1 使用类名调用静态的属性
console.log(PersonC2.love);
// 1.2 使用类名调用静态方法
PersonC2.sayLove()
console.log('-----------------------------');
let pc5 = new PersonC2('刘家锦', '保密')
// 2.1使用实例化对象调用静态属性 获取不到值
console.log(pc5.love); // undefined
// pc5.sayLove() // pc5.sayLove is not a function
pc5.sayHaha()
console.log('-----------------------------');
console.log('-----------------------------');
class BingRen2 extends PersonC2 {
  bingfang
  bingzheng
  // 2.私有属性
  #bingyin = ''
  constructor(bs, ...arg) {
    super(...arg)
    // this.bingfang = bf
    // this.bingzheng = bz
    // 1. 在构造函数中，使用对象解构的方式初始化属性
    {
      ({
        bingfang: this.bingfang,
        bingzheng: this.bingzheng
      } = bs)
    }
  }
  sayHi(status) {
    console.log(`在 ${this.bingfang} 病房，病症是：${this.bingzheng}`);
    this.say(status)
    // 4.1私有方法的调用
    this.#sayBingyin()
  }
  // 2.1私有属性在类中调用1
  getBingyin() {
    return this.#bingyin
  }
  setBingyin(val) {
    this.#bingyin = val
  }
  // 2.2私有属性在存取器调用
  // 3.存取器的使用
  get bingyin() {
    if (this.name === 'zhichao') {
      return this.#bingyin
    } else {
      return '未知'
    }
  }
  set bingyin(val) {
    this.#bingyin = val
  }
  // 4.私有方法定义
  #sayBingyin() {
    console.log(`我的病因是：${this.#bingyin}`);
  }
}
let userobj1 = {
  name: 'chao00000',
  sex: 'nan',
  birthday: '2002-12-12',
  shenfenzheng: '2343253535422524',
}
let bingrenObj = {
  bingzheng: '便秘',
  bingyin: '吃甜食'
}
// 6.解构方式给对象新增属性
bingrenObj = {
  ...bingrenObj,
  bingfang: '1号'
}
console.log(bingrenObj, 'bingrenObj');
// 创建对象
let br3 = new BingRen2(bingrenObj, 'zhichao', 'man')
// 调用普通属性OK
console.log(br3.bingfang);
// 调用普通的方法来设置私有属性的值
br3.setBingyin('熬夜')
// 调用普通的方法
br3.sayHi('正在康复中')
// 使用普通方法获取私有属性
console.log(br3.getBingyin());
// 调用存取器设置私有属性的值
br3.bingyin = '吃甜食'
// 调用存取器获取私有属性的值
console.log(br3.bingyin);
let br4 = new BingRen2(bingrenObj, 'xuewei', 'man')
br4.bingyin = '钻桌子'
console.log(br4.bingyin);
br4.sayHi('正在倒立罚站')






// let br1 = new BingRen('1号','精神病','zhichao','man')
// br1.sayHi('正在康复中。。')

// let br2 = new BingRen('抢救室','癫痫','cuimengjiao','girl')
// br2.sayHi('活蹦乱跳...')

// console.log('---------------------------------');


// let pc1 = new PersonC2('zhichao','man')
// pc1.say('好好学习')

// let pc2 = new PersonC2('cuimengjiao','girl')
// pc2.say('天天向上')
